<?php
/**
 * 练习题目
 */
namespace service\service;

use service\ext\PageData;
use service\vo\practice\Practice;
use service\vo\practice\PracticeSubject;

interface PracticeSubjectService
{
    const ERROR_PRACTICE_SUBJECT_NOT_EXISTS = 'ERROR_PRACTICE_SUBJECT_NOT_EXISTS';  //数据不存在
    const ERROR_PRACTICE_SUBJECT_USER_ID = 'ERROR_PRACTICE_SUBJECT_USER_ID';  //用户id必传

    /**
     * 添加练习题目
     * @param PracticeSubject $practiceSubject  练习题目对象
     * @return int
     */
    public function addPracticeSubject(PracticeSubject $practiceSubject) : int;

    /**
     * 更新自练译文
     * @param int $userId   用户id
     * @param int $id   练习题目id
     * @param string $translation   译文
     * @return int 影响的函数
     */
    public function updatePracticeSubjectTranslation(int $userId, int $id, string $translation) : int;

    /**
     * 根据id删除练习题目
     * @param int $userId   用户id
     * @param int $id   练习题目id
     * @return int  影响的函数
     */
    public function deletePracticeSubjectById(int $userId, int $id) : int;

    /**
     * 根据id集合批量删除练习题目
     * @param int $userId   用户id
     * @param array $ids    练习题目id集合
     * @return int  影响的行数
     */
    public function deletePracticeSubjectByIds(int $userId, array $ids) : int;

    /**
     * 删除用户下的所有练习题目
     * @param int $userId   用户id
     * @return int  影响的行数
     */
    public function deletePracticeSubjectByUserId(int $userId) : int;

    /**
     * 获取练习题目详情
     * @param int $userId 用户id
     * @param int $id   练习题目id
     * @return PracticeSubject  练习题目对象
     */
    public function getPracticeSubjectById(int $userId, int $id) : PracticeSubject;

    /**
     * 批量获取练习题目
     * @param int $userId 用户id
     * @param array $ids    练习题目id集合
     * @return array 练习题目集合
     */
    public function getPracticeSubjectByIds(int $userId, array $ids) : array;

    /**
     * 获取用户下的所有练习题目
     * @param int $userId   用户id
     * @return array    练习题目集合
     */
    public function getPracticeSubjectsByUserId(int $userId) : array;

    /**
     * 获取练习配置下所有的练习题目
     * @param int $userId 用户id
     * @param int $practiceId   练习配置id
     * @return array    练习题目集合
     */
    public function getPracticeSubjectsByPracticeId(int $userId, int $practiceId) : array;

    /**
     * 获取多个练习配置下所有的练习题目
     * @param int $userId 用户id
     * @param array $practiceIds 练习配置id集合
     * @return array    练习题目集合
     */
    public function getPracticeSubjectsByPracticeIds(int $userId, array $practiceIds) : array;

    /**
     * 搜索练习题目
     * @param int $currentPage 当前页
     * @param int $pageSize 每页显示数量
     * @param array $filterCriteria //搜索条件数组，其中的value是搜索值，其中的key从下面字符串中取
     *        'UserId'            =>    用户id
     *        'PracticeId'            =>    练习配置id
     *        'SubjectId'            =>    习题id
     *        'AddTime'        =>    时间，array('start'=>'开始时间','end'=>'结束时间')
     * @param array $sorterCriteria //排序条件，其中的value是搜索值，其中的key从下面字符串中取
     *        'ID'    =>    true为升序false为降序
     *
     * @return PageData
     */
    public function searchPracticeSubjects(int $currentPage, int $pageSize, array $filterCriteria, array $sorterCriteria): PageData;

}